package com.sheng.leetcode.year2022.month10.day31;

import org.junit.Test;

/**
 * @author liusheng
 * @date 2022/10/31
 *<p>
 * 481. 神奇字符串<p>
 *<p>
 * 神奇字符串 s 仅由 '1' 和 '2' 组成，并需要遵守下面的规则：<p>
 * 神奇字符串 s 的神奇之处在于，串联字符串中 '1' 和 '2' 的连续出现次数可以生成该字符串。<p>
 * s 的前几个元素是 s = "1221121221221121122……" 。<p>
 * 如果将 s 中连续的若干 1 和 2 进行分组，可以得到 "1 22 11 2 1 22 1 22 11 2 11 22 ......" 。<p>
 * 每组中 1 或者 2 的出现次数分别是 "1 2 2 1 1 2 1 2 2 1 2 2 ......" 。上面的出现次数正是 s 自身。<p>
 * 给你一个整数 n ，返回在神奇字符串 s 的前 n 个数字中 1 的数目。<p>
 *<p>
 * 示例 1：<p>
 * 输入：n = 6<p>
 * 输出：3<p>
 * 解释：神奇字符串 s 的前 6 个元素是 “122112”，它包含三个 1，因此返回 3 。<p>
 * <p>
 * 示例 2：<p>
 * 输入：n = 1<p>
 * 输出：1<p>
 *<p>
 * 提示：<p>
 * 1 <= n <= 105<p>
 */
public class LeetCode0481 {

    @Test
    public void test01() {
        int n = 6;
//        int n = 1;
        System.out.println(new Solution().magicalString(n));
    }
}
/**
 * 找规律：
 * 1    2    2    1    1    2    1    2    2    1    2    2    1    1
 * 1    22   11   2    1    22   1    22   11   2    11   22   1    2
 */
class Solution {
    public int magicalString(int n) {
        if (n <= 3) {
            return 1;
        }
        // 字符串的第一个字符默认为 1 ，从第三个字符开始按照规律进行计算
        int i = -1;
        int x = 2;
        String[] strs = {"1", "2"};
        int index = 0;
        StringBuilder str = new StringBuilder("122");
        int count = 1;
        int length = 3;
        while (str.length() < n) {
            // 每次都要在 0 和 1 之间切换
            i = Integer.parseInt(str.substring(x, x + 1));
            while (i > 0) {
                i--;
                length++;
                str.append(strs[index]);
                if (index == 0 && length <= n) {
                    count++;
                }
            }
            x++;
            if (index == 0) {
                index = 1;
            } else {
                index = 0;
            }
        }
        return count;
    }
}
